package com.zg.paging3.activity.net

import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.zg.ktcomwan.model.ArticleBean
import retrofit2.HttpException

/***
 * @Author:      zxd
 * @CreateDate:  2021/7/7 17:24
 * @Description:
 * 说明：
 * abstract class PagingSource<Key : Any, Value : Any>
 * 参数解析：Key：分页标识类型，如页码，则为Int
 * Value：返回列表元素的类型
 */
class NetDataSource(private val repositroty: NetDataRepositroty) :
    PagingSource<Int, ArticleBean>() {
    override fun getRefreshKey(state: PagingState<Int, ArticleBean>): Int? {
        return 0
    }

    /***
     * data ：返回的数据列表
     * prevKey ：上一页的key （传 null 表示没有上一页）
     * nextKey ：下一页的key （传 null 表示没有下一页）
     * paging3 使用 flow 传递数据，不了解的可以搜索一下flow ；
     * cachedIn：绑定协程生命周期，必须加上，否则可能崩溃；
     * asLiveData：熟悉livedata的都知道怎么用；转换成livedata
     */
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ArticleBean> {
        //页码：从0开始
        val page = params.key ?: 0
        return try {
            var articleList = repositroty.getArticleList(page)
            LoadResult.Page(
                articleList.data.datas,//需要加载的数据
                if (page <= 0) null else page - 1,//prevKey 如果可以往上加载更多就设置该参数，否则不设置（传 null 表示没有上一页）
                if (articleList.data.datas.isEmpty()) null else page + 1//nextKey 加载下一页的key 如果传null就说明到底了
            )
        } catch (e: Exception) {
            LoadResult.Error(e)
        } catch (e: HttpException) {
            // HttpException for any non-2xx HTTP status codes.
            return LoadResult.Error(e)
        }
    }
}